/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.sgsmcan.Utils;

import com.sgsmcan.Entidad.Ubigeo;
import java.util.ArrayList;
import java.util.List;
import javax.faces.model.SelectItem;

/**
 *
 * @author Luis Ballena
 *
 * Esta clase se ha adaptado para la tabla Ubigeo , lo cual va a segmentar la
 * informacion de la tabla.
 *
 */
public class SetUbigeo {

    private List<Nodo> nodos;

    public SetUbigeo() {
        nodos = new ArrayList<Nodo>();
    }

    public void addUbigeo(Ubigeo ubigeo) {
        if (!nodos.isEmpty()) {
            Nodo auxiliar = existeRegistro(ubigeo.getCodigoDepartamento(), nodos);
            if (auxiliar != null) {
                addProvincia(auxiliar, ubigeo);
            } else {
                addDepartamento(ubigeo);
                Nodo departamento = existeRegistro(ubigeo.getCodigoDepartamento(),nodos);
                addProvincia(departamento,ubigeo);
                Nodo provincia = existeRegistro(ubigeo.getCodigoProvincia(),departamento.getSubnodos());
                addDistrito(provincia, ubigeo);
            }
        } else {
            addDepartamento(ubigeo);
        }
    }

    private void addDepartamento(Ubigeo ubigeo) {
        nodos.add(new Nodo(ubigeo.getCodigoDepartamento(), ubigeo.getDepartamento()));
    }

    private void addProvincia(Nodo nodo, Ubigeo ubigeo) {
        List<Nodo> provincias = nodo.getSubnodos();
        Nodo auxiliar = existeRegistro(ubigeo.getCodigoProvincia(), provincias);
        if (auxiliar != null) {
            addDistrito(auxiliar, ubigeo);
        } else {
            provincias.add(new Nodo(ubigeo.getCodigoProvincia(), ubigeo.getProvincia()));
            nodo.setSubnodos(provincias);
            Nodo provincia = existeRegistro(ubigeo.getCodigoProvincia(), nodo.getSubnodos());
            addDistrito(provincia, ubigeo);
        }
        nodo.setSubnodos(provincias);
    }

    private void addDistrito(Nodo nodo, Ubigeo ubigeo) {
        List<Nodo> distritos = nodo.getSubnodos();
        Nodo auxiliar = existeRegistro(ubigeo.getCodigoDistrito(), distritos);
        if (auxiliar != null) {
            return;
        } else {
            distritos.add(new Nodo(ubigeo.getCodigoDistrito(), ubigeo.getDistrito()));
        }
        nodo.setSubnodos(distritos);
    }

    private Nodo existeRegistro(String codigo, List<Nodo> nodos) {
        for (Nodo nodo : nodos) {
            if (nodo.getId().equals(codigo)) {
                return nodo;
            }
        }
        return null;
    }

    public List<SelectItem> getDepartamentos() {
        List<SelectItem> items = new ArrayList<SelectItem>();
        for (Nodo nodo : nodos) {
            items.add(new SelectItem(nodo.getId(), (String) nodo.getValor()));
        }
        return items;
    }

    public List<SelectItem> getProvincia(String codigoDepartamento) {
        List<SelectItem> items = new ArrayList<SelectItem>();
        items.add(new SelectItem("0", "Seleccionar"));
        Nodo nodoProvincia = existeRegistro(codigoDepartamento, nodos);
        if (nodoProvincia != null) {
            for (Nodo nodo : nodoProvincia.getSubnodos()) {
                items.add(new SelectItem(nodo.getId(), (String) nodo.getValor()));
            }
        }

        return items;
    }

    public List<SelectItem> getDistrito(String codigoDepartamento, String codigoProvincia) {
        List<SelectItem> items = new ArrayList<SelectItem>();
        items.add(new SelectItem("0", "Seleccionar"));
        Nodo nodoProvincia = existeRegistro(codigoDepartamento, nodos);
        Nodo nodoDistrito = existeRegistro(codigoProvincia, nodoProvincia.getSubnodos());
        if(nodoDistrito != null){
            for (Nodo nodo : nodoDistrito.getSubnodos()) {
                items.add(new SelectItem(nodo.getId(), (String) nodo.getValor()));
            }
        }
        
        return items;
    }

    private class Nodo {

        String id;
        Object valor;
        List<Nodo> subnodos = new ArrayList<Nodo>();

        public Nodo() {
        }

        public Nodo(String id, Object valor) {
            this.id = id;
            this.valor = valor;
        }

        public String getId() {
            return id;
        }

        public void setId(String id) {
            this.id = id;
        }

        public Object getValor() {
            return valor;
        }

        public void setValor(Object valor) {
            this.valor = valor;
        }

        public List<Nodo> getSubnodos() {
            return subnodos;
        }

        public void setSubnodos(List<Nodo> subnodos) {
            this.subnodos = subnodos;
        }
    }
}
